home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-12-11 | 6.0 KB | 205 lines | [TEXT/CWIE] |
- // Release Version: $ ODF 3 $
- // Copyright: (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
-
- //========================================================================================
- #include "Talker.hpp"
-
- #ifndef CONTENT_H
- #include "Content.h"
- #endif
-
- #ifndef PART_H
- #include "Part.h"
- #endif
-
- #ifndef FWKIND_H
- #include "FWKind.h"
- #endif
-
- #ifndef SOM_DevUniv_STalker_xh
- #include "STalker.xh" // for STalker
- #endif
-
- //========================================================================================
- #ifdef FW_BUILD_MAC
- #pragma segment Talker
- #endif
-
- //========================================================================================
- const FW_Boolean kWaitUntilDone = TRUE;
-
- //========================================================================================
- FW_DEFINE_AUTO(CTalkerContent)
-
- //----------------------------------------------------------------------------------------
- CTalkerContent::CTalkerContent(Environment* ev, CTalkerPart* part) :
- FW_CContent(ev, part),
- fTextBuffer(NULL),
- fTextBytes(0),
- fTalkerPart(part),
- fSOMTalker(NULL)
- {
- fSOMTalker = new DevUniv_STalker;
- fSOMTalker->SayString(ev, "ODF", !kWaitUntilDone); // say it!
- fTextBuffer = FW_CMemoryManager::AllocateBlock(fTextBytes);
-
- FW_END_CONSTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- CTalkerContent::~CTalkerContent()
- {
- FW_START_DESTRUCTOR
- delete fSOMTalker;
- FW_CMemoryManager::FreeBlock(fTextBuffer);
- }
-
- //----------------------------------------------------------------------------------------
- void
- CTalkerContent::ExternalizeKind(Environment* ev,
- ODStorageUnit* storageUnit,
- FW_CKind* kind,
- FW_StorageKinds storageKind,
- FW_CPromise* promise,
- FW_CCloneInfo* cloneInfo)
- {
- FW_UNUSED(cloneInfo);
- FW_UNUSED(storageKind);
- FW_UNUSED(promise);
-
- FW_PStorageUnitSink suSink(ev, storageUnit, kODPropContents, kind->GetType(ev));
- FW_CWritableStream stream(suSink);
- if (kind->IsPartKind(ev)) {
- stream << fTextBytes;
- stream.Write(fTextBuffer, fTextBytes);
-
- FW_CPicture picture = this->MyGetPicture(ev);
- stream << picture;
- }
- }
-
- //----------------------------------------------------------------------------------------
- FW_Boolean
- CTalkerContent::InternalizeKind(Environment* ev,
- ODStorageUnit* sourceSU,
- FW_CKind* kind,
- FW_StorageKinds storageKind,
- FW_CCloneInfo* cloneInfo)
- {
- FW_UNUSED(cloneInfo);
- FW_UNUSED(storageKind);
- FW_Boolean internalized = false;
- if (kind->IsPartKind(ev))
- internalized = this->MyInternalizePartKind(ev, sourceSU, kind->GetType(ev));
-
- else if (kind->IsEqual(ev, 'TEXT', kODPlatformDataType))
- internalized = this->MyInternalizeTEXTData(ev, sourceSU, kind->GetType(ev));
-
- else if (kind->IsEqual(ev, 'PICT', kODPlatformDataType))
- internalized = this->MyInternalizePICTData(ev, sourceSU, kind->GetType(ev));
-
- if (internalized && storageKind != FW_kPartStorage) {
- const FW_Boolean kInvalidateOnly = true;
- fTalkerPart->PartChanged(ev, ! kInvalidateOnly);
- }
- return internalized;
- }
-
- //----------------------------------------------------------------------------------------
- FW_Boolean
- CTalkerContent::MyInternalizePartKind(Environment* ev, ODStorageUnit* sourceSU, ODType valueType)
- {
- FW_Boolean internalized = false;
- FW_PStorageUnitSink suSink(ev, sourceSU, kODPropContents, valueType);
- if (suSink->GetReadableBytes(ev) != 0) {
- FW_CReadableStream stream(suSink);
- stream >> fTextBytes;
- FW_CMemoryManager::FreeBlock(fTextBuffer);
- fTextBuffer = FW_CMemoryManager::AllocateBlock(fTextBytes);
- stream.Read(fTextBuffer, fTextBytes);
-
- stream >> fPicture;
-
- internalized = true;
- }
- return internalized;
- }
-
- //----------------------------------------------------------------------------------------
- FW_Boolean
- CTalkerContent::MyInternalizeTEXTData(Environment* ev, ODStorageUnit* sourceSU, ODType valueType)
- {
- FW_Boolean internalized = false;
- FW_PStorageUnitSink suSink(ev, sourceSU, kODPropContents, valueType);
- ODULong bytes = suSink->GetReadableBytes(ev);
- if (bytes >= 0) {
- FW_CReadableStream stream(suSink);
- fTextBytes = bytes;
- FW_CMemoryManager::FreeBlock(fTextBuffer);
- fTextBuffer = FW_CMemoryManager::AllocateBlock(fTextBytes);
- stream.Read(fTextBuffer, fTextBytes);
- internalized = true;
- this->MySayText(ev);
- }
- return internalized;
- }
-
- //----------------------------------------------------------------------------------------
- FW_Boolean
- CTalkerContent::MyInternalizePICTData(Environment* ev, ODStorageUnit* sourceSU, ODType valueType)
- {
- FW_Boolean internalized = false;
- FW_PStorageUnitSink suSink(ev, sourceSU, kODPropContents, valueType);
- ODULong bytes = sourceSU->GetSize(ev);
- if (bytes >= 0) {
- FW_PBufferedSink sink(ev, suSink);
- FW_CReadableStream stream(sink);
- FW_PlatformHandle h =
- FW_CMemoryManager::AllocateSystemHandle(bytes);
- FW_CMemoryManager::LockSystemHandle(h);
- stream.Read(*h, bytes);
- FW_CMemoryManager::UnlockSystemHandle(h);
- fPicture.AdoptPlatformPict((FW_PlatformPict)h);
- internalized = true;
- }
- return internalized;
- }
-
- //----------------------------------------------------------------------------------------
- void
- CTalkerContent::MySayText(Environment* ev)
- {
- fSOMTalker->SayText(ev, (char*)fTextBuffer, fTextBytes, !kWaitUntilDone); // say it!
- }
-
- //----------------------------------------------------------------------------------------
- DevUniv_STalker*
- CTalkerContent::MyGetTalker()
- {
- return fSOMTalker;
- }
-
- //----------------------------------------------------------------------------------------
- FW_CPicture
- CTalkerContent::MyGetPicture(Environment* ev)
- {
- if ((const void*)fPicture == NULL)
- {
- // Fool the compiler so we can do caching
- CTalkerContent* self = (CTalkerContent*)this;
- self->MyUseDefaultPicture(ev);
- }
-
- return fPicture;
- }
-
- //----------------------------------------------------------------------------------------
- void
- CTalkerContent::MyUseDefaultPicture(Environment* ev)
- {
- FW_PSharedLibraryResourceFile resFile(ev); // PICT resource in shared library
- const short kPizzaPictID = 2000;
- FW_CPicture pic(resFile, kPizzaPictID);
- fPicture = pic;
- }
-